知识点名称:Activity之间传值
编号: K3-6
前驱知识点编号:K3-1,K3-2,K3-5
作者:
讲义内容:
前面我们介绍过在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent intent)方法来传入一个Intent对象,这个Intent对象可以精确的指定要跳转到的Activity上,同时可以通过intent来携带一些值,进而完成Activity在跳转的时候把值传过去。
另外一些情况下,我们通过 Aactivity跳转到 Bactivity上,这时希望 Aactivtiy能从Bactivity上得到一些返回值,这个时候我们就不能使用startActivity方法了,而是使用 startActivityForResult方法来完成我们的操作。这样的场景在实际开发中还是很常见的,比如说Aactivity中做了一个查询的功能,查询向后台请求数据,假设需要传入一个时间字段,不传的话默认是当前时间,Bactivity中可以设置时间,那我们就可以在Bactivity中设置时间,并根据Bactivity传回来的时间,在
Aactivity中就会有不同的查询结果。
因此,Activity之间有两种传值方式,一种是使用startActivity方法,在页面跳转时,将值从一个Activity传入另一个;另外一种是使用startActivityForResult方法,将值从跳转到的目标页面带回来。下面,我们就两种方式给出详细介绍。
- 通过startActivity来进行Activity的传值
使用Intent传递数据只需调用putExtra()方法将想要存储的数据存在Intent中即可。当启动了另一个Activity后,再把这些数据从Intent中取出即可。
在Aactivity中将数据存储在Intent中
String data = " welcome to Bactivity "
Intent intent = new Intent(this,Bactivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
从Bactivity中取出传递过来的数据
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.i("Bactivity ", data);
还有一种传递数据的方式是调用putExtras()方法传递数据,该方法传递的是Bundle对象,相当于将传递的数据封装在一个Bundle对象中。调用putExtras()方法传递数据可以使用如下代码:
Bundle bundle = new Bundle();
bundle.putString("name", "Linda");
bundle.putInt("age", 20);
Intent intent = new Intent(this,Bactivity.class);
intent.putExtras(bundle);
startActivity(intent);
如果想要在Bactivity中取出上述方式传递的数据,可以使用如下代码:
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String stuName = bundle.getString("name");
int stuAge = bundle.getString("age");
下面我们通过一个实例来演示,设置一个登录界面Login,将登录名和密码传入一个新的界面Welcome。
登录界面的布局文件设置如下:
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" />
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPassword" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"/>
登录界面Login中代码如下:
private EditText tName,tPassword;
private Button b;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
tName=(EditText) this.findViewById(R.id.editText1);
tPassword=(EditText) this.findViewById(R.id.editText2);
b=(Button) this.findViewById(R.id.button1);
//点击按钮获取用户名和密码,并跳转到Welcome界面
b.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
Intent intent=new Intent(Login.this,Welcome.class);
Bundle bundle=new Bundle();
bundle.putString("name", tName.getText().toString());
bundle.putString("password", tPassword.getText().toString());
intent.putExtras(bundle);
Login.this.startActivity(intent);
}
});
}
在Welcome界面获取传入的数据,代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
Intent intent=this.getIntent();
Bundle bundle=intent.getExtras();
String name=bundle.getString("name");
TextView tView=(TextView) this.findViewById(R.id.textView1);
tView.setText("name="+name+",password="+password); }
如果输入的用户名是zhangsan,密码是110,我们来看接收到的数据显示:
以上实例展示了页面传值的情况,接下来我们看如何将数据回传。
2通过startActivityForResult回传数据
我们有时在使用微信发送图片时,通常会调到图库里面选择好要发送的图片,然后回到微信界面会看到刚选到的图片,其实这种效果是通过Andorid中的startActivityForResult()方法实现的。
startActivityForResult()示例代码如下:
Intent intent = new Intent(this,Bactivity.class);
startActivityForResult(intent,1);
在Bactivity中添加数据返回的示例代码,具体如下所示:
Intent intent = new Intent();
intent.putExtra("extra_data","Hello Activity");
setResult(1,intent);
finish();
由于使用了startActivityForResult()方法启动Aactivity,因此会在Aactiivity页面回调onActivityResult()方法,需要在Aactiivity中重写该方法来获取返回的数据,有的Activity对象的返回值都是由这个方法来接收,因此代码如下:
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1) {
String data = data.getStringExtra("extra_data");
Log.i("Aactivity",data);
}
}
方法中的参数说明:
- requestCode: If >= 0, this code will be returned in onActivityResult() when the activity exits.
- requestCode :表示的是启动一个Activity时传过去的requestCode值
- resultCode :表示的是启动后的Activity回传值时的resultCode值
- data :表示的是启动后的Activity回传过来的Intent对象
下面我们以一个具体的实例来演示数据的回传,主界面SourceActiviy向目标界面TargetActivity传递需要计算的数据和运算符,目标界面TargetActivity计算并返回计算结果,在主界面SourceActiviy中显示结果,规定只能进行加减乘除的运算。
主界面SourceActiviy的布局文件包括三个文本框用来输入需要计算的数字和运算符,点击计算按钮,以消息的形式显示计算结果,布局文件代码如下:
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" /
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计算" />
主界面SourceActiviy传值部分的代码如下:
private EditText num1,num2;
private Button b;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
num1=(EditText) this.findViewById(R.id.editText1);
num2=(EditText) this.findViewById(R.id.editText2);
b=(Button) this.findViewById(R.id.button1);
//点击按钮获取获取运算数据和运算符,传入目标界面
b.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
Intent intent=new Intent(Login.this,TargetActivity.class);
Bundle bundle=new Bundle();
String n1=num1.getText().toString();
String n2=num2.getText().toString();
bundle.putString("num1",n1 );
bundle.putString("num2", n2);
intent.putExtras(bundle);
Login.this.startActivityForResult(intent,1);
}
});
}
目标界面TargetActivity接收数据并计算且回传的代码如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.target);
Intent intent=this.getIntent();
Bundle bundle=intent.getExtras();
int n1=Integer.parseInt(bundle.getString("num1"));
int n2=Integer.parseInt(bundle.getString("num2"));
int result=n1+n2;
intent=new Intent();
intent.putExtra("result", result);
this.setResult(1, intent);
finish();
}
主界面SourceActiviy接收回传过来的代码如下:
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1) {
if (resultCode == 1) {
String result=data.getStringExtra("result");
Toast.makeText(this,"回传计算结果是:"+ result, Toast.LENGTH_SHORT).show();
} }
}
我们来看一下运行结果,主界面输入的数据如下:
点击计算按钮后的结果如下:
以上实例详细展示了Activity之间的数据回传。
至此,本章我们详细讲解了有关Activity的创建与启动、生命周期以及它们之间进行数据传递的知识。